home *** CD-ROM | disk | FTP | other *** search
/ Power Hacker 2003 / Power_Hacker_2003.iso / Exploit and vulnerability / w00w00 / sectools / dsniff / decode_http.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-05-16  |  1.7 KB  |  90 lines

  1. /*
  2.   decode_http.c
  3.  
  4.   Hypertext Transfer Protocol.
  5.   
  6.   Copyright (c) 2000 Dug Song <dugsong@monkey.org>
  7.  
  8.   $Id: decode_http.c,v 1.2 2000/05/16 18:48:01 dugsong Exp $
  9. */
  10.  
  11. #include "config.h"
  12. #include <sys/types.h>
  13. #include <stdio.h>
  14. #include <string.h>
  15. #ifdef HAVE_LIBGEN_H
  16. #include <libgen.h>
  17. #endif
  18. #include "base64.h"
  19. #include "decode.h"
  20.  
  21. char *
  22. http_req_dirname(char *req)
  23. {
  24.     char *uri, *vers;
  25.     
  26.     if ((uri = strchr(req, ' ')) == NULL)
  27.         return (req);
  28.     
  29.     if ((vers = strrchr(uri, ' ')) == uri)
  30.         vers = NULL;
  31.     else if (vers[-1] == '/')
  32.         return (req);
  33.     else
  34.         *vers++ = '\0';
  35.     
  36.     strcpy(req, dirname(req));
  37.     strcat(req, "/");
  38.     
  39.     if (vers) {
  40.         strcat(req, " ");
  41.         strcat(req, vers);
  42.     }
  43.     return (req);
  44. }  
  45.  
  46. int
  47. decode_http(u_char *buf, int len)
  48. {
  49.     char *p, *s, *e;
  50.     int i;
  51.     
  52.     Buf[0] = '\0';
  53.     
  54.     /* Process requests. */
  55.     for (s = buf; (e = bufbuf(s, len, "\r\n\r\n", 4)) != NULL; s = e + 4) {
  56.         len -= (e + 4) - s;
  57.         *e = '\0';
  58.         
  59.         /* Check for auth info. */
  60.         if (strstr(s, "uthorization: ") == NULL)
  61.             continue;
  62.         
  63.         /* Process header. */
  64.         for (p = strtok(s, "\r\n"); p != NULL; p = strtok(NULL, "\r\n")) {
  65.             if (!strlen(p)) continue;
  66.             
  67.             if (strncasecmp(p, "GET ", 4) == 0 ||
  68.                 strncasecmp(p, "POST ", 5) == 0) {
  69.                 p = http_req_dirname(p);
  70.                 strlcat(Buf, p, sizeof(Buf));
  71.                 strlcat(Buf, "\n", sizeof(Buf));
  72.             }
  73.             else if (strncasecmp(p, "Host: ", 6) == 0) {
  74.                 strlcat(Buf, p, sizeof(Buf));
  75.                 strlcat(Buf, "\n", sizeof(Buf));
  76.             }
  77.             else if (strncasecmp(p, "Authorization: Basic ", 21) == 0 ) {
  78.                 strlcat(Buf, p, sizeof(Buf));
  79.                 p += 21;
  80.                 i = base64_pton(p, p, strlen(p));
  81.                 p[i] = '\0';
  82.                 strlcat(Buf, " [", sizeof(Buf));
  83.                 strlcat(Buf, p, sizeof(Buf));
  84.                 strlcat(Buf, "]\n\n", sizeof(Buf));
  85.             }
  86.         }
  87.     }
  88.     return (strlen(Buf));
  89. }
  90.